﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Text.RegularExpressions;

namespace BuscoPre.Domain.Services
{
	public class FriendlyUrl
	{
		/// <summary>
		/// Convierte un string en una url amigable.
		/// </summary>
		/// <param name="strTitle"></param>
		/// <returns></returns>
		public static string TitleToSeoURL(string strTitle)
		{
			char[] allChars;

			//cadena de caracteres a ser reemplazados    
			string sCharsToReplace = "áéíóúüñç_";
			//cadena de caracteres para reemplazar, en el mismo orden
			string sCharsForReplace = "aeiouunz-";
			string seoURL = string.Empty;
			int charPos = 0;

			// decodifica cualquier entidad HTML antes de empezar.
			strTitle = HttpContext.Current.Server.HtmlDecode(strTitle);
			strTitle = strTitle.ToLower();
			strTitle = strTitle.Trim();

			// reemplaza todos los caracteres transparentes.
			strTitle = Regex.Replace(strTitle, @"\s+", "-");

			// El siguiente bucle reemplaza todos los caracteres
			// encontrados en sCharsToReplace por los de sCharsForReplace 
			allChars = strTitle.ToCharArray();
			for (int i = 0; i < allChars.Length; i++)
			{
				charPos = sCharsToReplace.IndexOf(allChars[i]);
				if (charPos != -1)
				{ allChars[i] = sCharsForReplace[charPos]; }
				seoURL += allChars[i];
			}

			// Remueve cualquier caracter no reemplazado que no
			// esté entre a y z, que no sea número o que no sea un guión (-)

			seoURL = new Regex("[^a-z0-9-]").Replace(seoURL, "");
			// remueve cualquier guión solitario al final o principio
			// de la cadena resultante
			seoURL = seoURL.Trim('-');

			// Limita el resultado a 80 caracteres.

			if (seoURL.Length > 80)
				seoURL = seoURL.Substring(0, 80);

			return seoURL;
		}

		/// <summary>
		/// Añade el application path, para poder agregar por ejemplo el directorio virtual del proyecto "BuscoPre.UI/{friendlyURL}"
		/// </summary>
		/// <param name="strTitle"></param>
		/// <returns>La url convertida a una direccion de un recurso "mas" amigable.</returns>
		public static string TitleToSeoURLWithServerPath(string strTitle)
		{
			var seoUrl = TitleToSeoURL(strTitle);

			return string.Concat(HttpContext.Current.Request.ApplicationPath, "/", seoUrl);
		}
	}
}
